//package com.inspur.edp.cef.generator.coreGenerator.base.serializer;
//
//import com.fasterxml.jackson.core.JsonParser;
//import com.fasterxml.jackson.databind.DeserializationContext;
//import com.inspur.edp.caf.generator.baseInfo.ParameterInfo;
//import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
//import com.inspur.edp.caf.generator.method.ClassMethodGenerator;
//import com.inspur.edp.caf.generator.utils.ExpressionUtils;
//import com.inspur.edp.cef.designtime.api.IGspCommonField;
//import com.inspur.edp.cef.designtime.api.element.GspElementObjectType;
//import com.inspur.edp.cef.entity.entity.IEntityData;
//import com.inspur.edp.cef.generator.coreGenerator.base.entityGenerator.CefDataTypeImplGeneratorContext;
//import com.inspur.edp.cef.generator.coreGenerator.entityGenerator.serializer.CMChangeJsonConvertorGenUtils;
//import com.inspur.edp.cef.generator.overall.GenUtils;
//import com.inspur.edp.cef.generator.overall.Utils;
//import com.inspur.edp.das.commonmodel.IGspCommonElement;
//import com.inspur.edp.udt.designtime.api.entity.UnifiedDataTypeDef;
//import org.eclipse.jdt.core.dom.Block;
//import org.eclipse.jdt.core.dom.CastExpression;
//import org.eclipse.jdt.core.dom.Expression;
//import org.eclipse.jdt.core.dom.MethodInvocation;
//import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
//import org.eclipse.jdt.core.dom.ReturnStatement;
//import org.eclipse.jdt.core.dom.Statement;
//import org.eclipse.jdt.core.dom.SwitchStatement;
//import org.eclipse.jdt.core.dom.TypeLiteral;
//import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
//import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
//
//
//public class ReadEntityBasicInfoGenerator extends ClassMethodGenerator {
//
//  protected CefDataTypeImplGeneratorContext dataTypeGenContext;
//  protected static final String methodName = "readEntityBasicInfo";
//  protected static final String paramReader = "reader";
//  protected static final String paramData = "data";
//  protected static final String paramPropertyName = "propertyName";
//  protected static final String paramSerializer = "serializer";
//  //  protected static final String paramPropertyValue = "propertyValue";
//  protected static final String varEntityData = "entityData";
//
//  public ReadEntityBasicInfoGenerator(CefDataTypeImplGeneratorContext dataTypeGenContext) {
//    this.dataTypeGenContext = dataTypeGenContext;
//  }
//
//  @Override
//  protected boolean getIsOverride() {
//    return true;
//  }
//
//  @Override
//  protected Block buildMethodBody() {
//    Block block = ast.newBlock();
//    block.statements().add(getTypeAsStatement());
//    block.statements().add(getSwitchBlock());
//    block.statements().add(getReturnStatement());
//
//    return block;
//  }
//
//  private Statement getReturnStatement() {
//    ReturnStatement returnStatement = ast.newReturnStatement();
//    returnStatement.setExpression(ast.newBooleanLiteral(false));
//    return returnStatement;
//  }
//
//  private org.eclipse.jdt.core.dom.Statement getTypeAsStatement() {
//    TypeInfo typeInfo =
//        new TypeInfo(dataTypeGenContext.dataType.getGeneratedEntityClassInfo().getClassName());
//    typeInfo.setTypePackageName(
//        dataTypeGenContext.dataType.getGeneratedEntityClassInfo().getClassNamespace());
//
//    VariableDeclarationFragment variableDeclarationFragment = ast.newVariableDeclarationFragment();
//    variableDeclarationFragment.setName(ast.newSimpleName(varEntityData));
//    CastExpression castExpression = ast.newCastExpression();
//    castExpression.setType(ast.newSimpleType(ast.newName(typeInfo.getTypeFullName())));
//    castExpression.setExpression(ast.newSimpleName(paramData));
//    variableDeclarationFragment.setInitializer(castExpression);
//
//    VariableDeclarationStatement variableDeclarationStatement =
//        ast.newVariableDeclarationStatement(variableDeclarationFragment);
//    variableDeclarationStatement
//        .setType(ast.newSimpleType(ast.newName(typeInfo.getTypeFullName())));
//    return variableDeclarationStatement;
//  }
//
//  private SwitchStatement getSwitchBlock() {
//    String propertyname = "";
//    switch (propertyname) {
//      case "User1":
//      case "user1":
//        int i =
//            1; // demoSalesOrder.User1 = (User1Info)ReadUser1Association(reader, propertyValue,
//        // serializer);
//        return null;
//    }
//    SwitchStatement switchStatement = ast.newSwitchStatement();
//    switchStatement.setExpression(ast.newSimpleName(paramPropertyName));
//    for (IGspCommonField item : getContainElements()) {
//      if (item.getIsUdt()
//          && item.getObjectType() == GspElementObjectType.Association
//          && item.containRefElementNotFromAssoUdt()) {
//        continue;
//      }
//      SerItemGenUtil.buildSwitchLables(ast, switchStatement, item.getLabelID());
//      switchStatement.statements().add(getElementCase(item));
//      ReturnStatement returnStatement = ast.newReturnStatement();
//      returnStatement.setExpression(ast.newBooleanLiteral(true));
//      switchStatement.statements().add(returnStatement);
//    }
//    return switchStatement;
//  }
//
//  protected Iterable<IGspCommonField> getContainElements() {
//    return dataTypeGenContext.dataType.getContainElements();
//  }
//
//  private org.eclipse.jdt.core.dom.Statement getElementCase(IGspCommonField element) {
//    if (element.getObjectType() == GspElementObjectType.DynamicProp) {
//      return getDynamicPropStatement(element);
//    }
//
//    Expression readValueStatement = null;
//    if (element.getIsUdt()) {
//      readValueStatement = getUdtStatment(element);
//    } else {
//      switch (element.getObjectType()) {
//        case None:
//          readValueStatement = readBasicProperty(element);
//          break;
//        case Association:
//          readValueStatement = readAssProperty(element);
//          break;
//        case Enum:
//          readValueStatement = readEnumProperty(element);
//          break;
//        default:
//          throw new RuntimeException();
//      }
//    }
//    MethodInvocation setValueInvocation = ast.newMethodInvocation();
//    setValueInvocation.setName(ast.newSimpleName("set" + element.getLabelID()));
//    setValueInvocation.setExpression(ast.newSimpleName(varEntityData));
//    setValueInvocation.arguments().add(readValueStatement);
//    return ast.newExpressionStatement(setValueInvocation);
//  }
//
//  // readDynamicPropSetValue(IDynamicPropSet data, String dynPropSetPropName, IDynamicPropSerItem serItem, JsonParser reader, DeserializationContext ctx)
//  private org.eclipse.jdt.core.dom.Statement getDynamicPropStatement(IGspCommonField element) {
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation.setName(ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadDynamicPropValue));
//    methodInvocation.arguments().add(GenUtils.getMethodInvocation(ast, ast.newSimpleName(varEntityData), "get" + element.getLabelID()));
//    methodInvocation.arguments().add(ExpressionUtils.getStringLiteral(ast,element.getLabelID()));
//    methodInvocation.arguments().add(ast.newSimpleName(DynamicSerItemsFieldGenerator.getFieldName(element)));
//    methodInvocation.arguments().add(ast.newSimpleName(paramReader));
//    methodInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//
//    return ast.newExpressionStatement(methodInvocation);
//  }
//
//  // protected T ReadNestedValue<T>(string nestedConfigId, object value)
//  private Expression getUdtStatment(IGspCommonField element) {
//    UnifiedDataTypeDef udtDef =
//        dataTypeGenContext
//            .coreGenContext
//            .getCefGenContext()
//            .getMetadataContent(element.getUdtPkgName(), element.getUdtID());
//    // var udtType = dataTypeGenContext.EntityGenContext.CefGenContext.GetType(
//    //    element.getUdtID(),
//    //    udtDef.getGeneratedEntityClassInfo().AssemblyInfo.getAssemblyName(),
//    //    udtDef.getGeneratedEntityClassInfo().GetClassFullName());
//    MethodInvocation readNestedInvocation = ast.newMethodInvocation();
//    readNestedInvocation.setName(
//        ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadNestedValue));
//    readNestedInvocation.arguments().add(ExpressionUtils.getStringLiteral(ast, udtDef.getUdtType()));
//    readNestedInvocation.arguments().add(ast.newSimpleName(paramReader));
//    readNestedInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    if (SerItemGenUtil.getEnableStdDateTime(dataTypeGenContext)) {
//      SerItemGenUtil.addGetNestedSerializeContextArg(ast, readNestedInvocation);
//    }
//    return readNestedInvocation;
//  }
//
//  private MethodInvocation readBasicProperty(IGspCommonField element) {
//    switch (element.getMDataType()) {
//      case String:
//      case Text:
//        return readStringProperty(element);
//      case Integer:
//        return readIntProperty(element);
//      case Decimal:
//        return readDecimalProperty(element);
//      case Date:
//      case DateTime:
//        return readDateProperty(element);
//      case Boolean:
//        return readBoolProperty(element);
//      case Binary:
//        return readBinaryProperty(element);
//      default:
//        throw new RuntimeException();
//    }
//  }
//
//  private MethodInvocation readProperty(IGspCommonField element, String methodName) {
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation.setName(ast.newSimpleName(methodName));
//    methodInvocation.arguments().add(ast.newSimpleName(paramReader));
//    return methodInvocation;
//  }
//
//  private MethodInvocation readStringProperty(IGspCommonField element) {
//    return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadString);
//  }
//
//  private MethodInvocation readIntProperty(IGspCommonField element) {
//    return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadInt);
//  }
//
//  private MethodInvocation readDecimalProperty(IGspCommonField element) {
//    return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadDecimal);
//  }
//
//  private MethodInvocation readDateProperty(IGspCommonField element) {
//    if (SerItemGenUtil.getEnableStdDateTime(dataTypeGenContext)) {
//      return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadStdDateTime);
//    } else {
//      return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadDateTime);
//    }
//  }
//
//
//  private MethodInvocation readBoolProperty(IGspCommonField element) {
//    return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadBool);
//  }
//
//  private MethodInvocation readBinaryProperty(IGspCommonField element) {
//    return readProperty(element, CMChangeJsonConvertorGenUtils.mName_ReadBytes);
//  }
//
//  private Expression readAssProperty(IGspCommonField element) {
//    // TODO: java版临时注释 暂不支持dbe
//    TypeInfo assTypeSyntax =
//        Utils.getRefElementTypeSyntax(
//            dataTypeGenContext.coreGenContext.getCefGenContext(), element);
//    String assoMethodName =
//        dataTypeGenContext.getAssociationReadMetdNames().get(element.getLabelID());
//
//    CastExpression castExpression = ast.newCastExpression();
//    castExpression.setType(assTypeSyntax.getType(ast));
//    MethodInvocation readAssoInvocation = ast.newMethodInvocation();
//    readAssoInvocation.setName(ast.newSimpleName(assoMethodName));
//    readAssoInvocation.arguments().add(ast.newSimpleName(paramReader));
//    readAssoInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    castExpression.setExpression(readAssoInvocation);
//    return castExpression;
//  }
//
//  private Expression readEnumProperty(IGspCommonField element) {
//    TypeInfo assTypeSyntax = new TypeInfo(SerItemGenUtil.getEnumTypeName(element));
//    assTypeSyntax.setTypePackageName(
//        dataTypeGenContext.dataType.getGeneratedEntityClassInfo().getClassNamespace());
//    MethodInvocation readEnumInvocation = ast.newMethodInvocation();
//    readEnumInvocation.setName(ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadEnum));
//    readEnumInvocation.arguments().add(ast.newSimpleName(paramReader));
//    TypeLiteral typeLiteral = ast.newTypeLiteral();
//    typeLiteral.setType(ast.newSimpleType(ast.newName(assTypeSyntax.getTypeFullName())));
//    readEnumInvocation.arguments().add(typeLiteral);
//    return readEnumInvocation;
//  }
//
//  // TODO: 暂时屏蔽udt的生成
//  // TODO:与ReadModifyPropertyValueGenerator重复代码
//  private java.lang.Class getUdtType(IGspCommonElement element) {
//    throw new UnsupportedOperationException();
//    // var udtDef = (SimpleDataTypeDef)ServiceManager.GetService<IMetadataService>().GetRefMetadata(
//    //    entityDataSerGenContext.NodeGenContext.EntityGenContext.RelativePath, element.getUdtID(),
//    // element..getUdtPkgName()).getContent();
//    // var udtGenType = ReflectionUtil.GetTypeFromAssembly(udtDef.getAssemblyName(),
//    //    string.Concat(udtDef.getAssemblyName(), ".", udtDef.GetUdtEntityClassName()));
//    // return udtGenType.BaseType.GetGenericArguments()[0];
//  }
//
//  @Override
//  protected java.util.ArrayList<ParameterInfo> getParameterCollection() {
//    ParameterInfo readerInfo = new ParameterInfo();
//    readerInfo.setParamName(paramReader);
//    TypeInfo readerTypeInfo = new TypeInfo(JsonParser.class);
//    readerTypeInfo.setTypePackageName(JsonParser.class.getPackage().getName());
//    readerInfo.setParamType(readerTypeInfo);
//
//    ParameterInfo serializerInfo = new ParameterInfo();
//    serializerInfo.setParamName(paramSerializer);
//    TypeInfo serializerTypeInfo = new TypeInfo(DeserializationContext.class);
//    serializerTypeInfo.setTypePackageName(DeserializationContext.class.getPackage().getName());
//    serializerInfo.setParamType(serializerTypeInfo);
//
//    ParameterInfo dataInfo = new ParameterInfo();
//    dataInfo.setParamName(paramData);
//    TypeInfo dataTypeInfo = new TypeInfo(IEntityData.class);
//    dataTypeInfo.setTypePackageName(IEntityData.class.getPackage().getName());
//    dataInfo.setParamType(dataTypeInfo);
//
//    ParameterInfo propNameInfo = new ParameterInfo();
//    propNameInfo.setParamName(paramPropertyName);
//    TypeInfo propNameTypeInfo = new TypeInfo(String.class);
//    propNameInfo.setParamType(propNameTypeInfo);
//
//    return new java.util.ArrayList<ParameterInfo>(
//      java.util.Arrays.asList(
//            new ParameterInfo[] {readerInfo, serializerInfo, dataInfo, propNameInfo}));
//  }
//
//  @Override
//  protected java.util.ArrayList<ModifierKeyword> getAccessModifiers() {
//    return new java.util.ArrayList<ModifierKeyword>(
//        java.util.Arrays.asList(new ModifierKeyword[] {ModifierKeyword.PUBLIC_KEYWORD}));
//  }
//
//  @Override
//  protected String getMethodName() {
//    return methodName;
//  }
//
//  @Override
//  protected TypeInfo getReturnType() {
//    return new TypeInfo(boolean.class.getName());
//  }
//}
